﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace FrbaCommerce.Abm_Empresa
{
    public partial class frm_crearEmpresa : Form
    {
        private bool razonSocialValido = false;
        private bool telEmpValido = false;
        private bool cuitValido = false;
        private bool camposObligatorios = false;

        public frm_crearEmpresa()
        {
            InitializeComponent();
        }

        private void frm_crearEmpresa_Load(object sender, EventArgs e)
        {

        }

        private void btn_autogenerar_Click(object sender, EventArgs e)
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "SELECT MAX(ID_USUARIO) FROM LOS_GDDES.USUARIOS;";
            sqlCommand.CommandType = CommandType.Text;
            int idUsuario = baseDeDatos.ejecuta(sqlCommand) + 1;
            string nombreDeUsuario = "usuario" + Convert.ToString(idUsuario);
            txt_nombreDeUsuario.Text = nombreDeUsuario;
            txt_contrasenia.Text = "contrasenia" + Convert.ToString(idUsuario);
        }

        //---Validar Campos de la Empresa---//
        private void txt_razonSocialEmpresa_Leave(object sender, EventArgs e)
        {
            validar_razonSocialEmp();
        }

        private void validar_razonSocialEmp()
        {
            if (txt_razonSocialEmpresa.Text != "")
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_EMPRESA_RAZON_SOCIAL";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@razon_social", txt_razonSocialEmpresa.Text);
                int razonSocialExistente = baseDeDatos.ejecuta(sqlCommand);

                if (razonSocialExistente > 0)
                {
                    txt_razonSocialEmpresa.BackColor = Color.Red;
                    razonSocialValido = false;
                }
                else
                {
                    txt_razonSocialEmpresa.BackColor = Color.White;
                    razonSocialValido = true;
                }
            }
        }

        private void txt_telEmpresa_Leave(object sender, EventArgs e)
        {
            validar_telEmp();
        }

        private void validar_telEmp()
        {
            if (txt_telEmpresa.Text != "")
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_EMPRESA_TELEFONO";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telEmpresa.Text));
                int telEmpExistente = baseDeDatos.ejecuta(sqlCommand);

                if (telEmpExistente > 0)
                {

                }
                else
                {
                    txt_telEmpresa.BackColor = Color.White;
                    telEmpValido = true;
                }
            }
        }

        private void txt_cuitEmpresa_Leave(object sender, EventArgs e)
        {
            validar_cuitEmp();
        }

        private void validar_cuitEmp()
        {
            if (txt_cuitEmpresa.Text != "" && FuncionesUtiles.validateCuit(txt_cuitEmpresa.Text) == true)
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_EMPRESA_CUIT";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@cuit", txt_cuitEmpresa.Text);
                int cuitEmpExistente = baseDeDatos.ejecuta(sqlCommand);

                if (cuitEmpExistente > 0)
                {
                    txt_cuitEmpresa.BackColor = Color.Red;
                    cuitValido = false;
                }
                else
                {
                    txt_cuitEmpresa.BackColor = Color.White;
                    cuitValido = true;
                }
            }
            else
            {
                txt_cuitEmpresa.BackColor = Color.Red;
                cuitValido = false;
            }
        }
        //---Validar Campos de la Empresa---//

        //---Validar Campos Obligatorios Completos---//
        private void verificar_campos_obligatorios()
        {
            var camposObligatorios = new List<Control>();
            camposObligatorios.Add(txt_nombreDeUsuario);
            camposObligatorios.Add(txt_contrasenia);
            camposObligatorios.Add(txt_razonSocialEmpresa);
            camposObligatorios.Add(txt_emailEmpresa);
            camposObligatorios.Add(txt_telEmpresa);
            camposObligatorios.Add(txt_dirEmpresa);
            camposObligatorios.Add(txt_nroDirEmpresa);
            camposObligatorios.Add(txt_localidadEmpresa);
            camposObligatorios.Add(txt_CPEmpresa);
            camposObligatorios.Add(txt_cuitEmpresa);
            camposObligatorios.Add(txt_nombreContEmpresa);
            camposObligatorios.Add(dtp_fecCreacEmpresa);

            if (camposObligatorios.All<Control>(campos => campos.Text != ""))
                this.camposObligatorios = true;
            else
                this.camposObligatorios = false;

            var camposIncompletos = camposObligatorios.FindAll(campos => campos.Text == "");
            camposIncompletos.ForEach(campos => campos.BackColor = Color.Red);
            var camposCompletos = camposObligatorios.FindAll(campos => campos.Text != "");
            camposCompletos.ForEach(campos => campos.BackColor = Color.White);
        }
        //---Validar Campos Obligatorios Completos---//


        private void btn_guardar_Click(object sender, EventArgs e)
        {
            this.verificar_campos_obligatorios();
            this.validar_razonSocialEmp();
            this.validar_telEmp();
            this.validar_cuitEmp();

            if (razonSocialValido && telEmpValido && cuitValido && camposObligatorios)
            {
                this.registrar_usuario_empresa();
                this.Close();
            }
        }

        private void btn_limpiar_Click(object sender, EventArgs e)
        {
            this.Controls.OfType<GroupBox>().ToList().ForEach(groupBox => groupBox.Controls.OfType<TextBox>().ToList().ForEach(textBox => textBox.Text = String.Empty));
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void registrar_usuario_empresa()
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_USUARIO";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            string contraseniaEncriptada = Encriptar.SHA256(txt_contrasenia.Text);
            sqlCommand.Parameters.AddWithValue("@password", contraseniaEncriptada);
            baseDeDatos.ejecuta(sqlCommand);

            sqlCommand.CommandText = "UPDATE LOS_GDDES.USUARIOS SET PRIMER_ACCESO = 1 " +
                                     "WHERE USERNAME = @username;";
            sqlCommand.CommandType = CommandType.Text;
            sqlCommand.Parameters.Clear();
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            baseDeDatos.ejecuta(sqlCommand);

            sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_EMPRESA";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.Clear();
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            sqlCommand.Parameters.AddWithValue("@razon_social", txt_razonSocialEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@mail", txt_emailEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telEmpresa.Text));
            sqlCommand.Parameters.AddWithValue("@direccion_nombre", txt_dirEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@direccion_nro", Convert.ToInt32(txt_nroDirEmpresa.Text));
            if(txt_pisoDirEmpresa.Text != "")
                sqlCommand.Parameters.AddWithValue("@nro_piso", Convert.ToInt32(txt_pisoDirEmpresa.Text));
            if(txt_dptoDirEmpresa.Text != "")
                sqlCommand.Parameters.AddWithValue("@depto", txt_dptoDirEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@localidad", txt_localidadEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@cod_postal", txt_CPEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@cuit", txt_cuitEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@nombre_contacto", txt_nombreContEmpresa.Text);
            sqlCommand.Parameters.AddWithValue("@fecha_creacion", Convert.ToDateTime(dtp_fecCreacEmpresa.Text));
            baseDeDatos.ejecuta(sqlCommand);
        }

        private void txt_telEmpresa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_nroDirEmpresa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_pisoDirEmpresa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_CPEmpresa_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }
    }
}
